# push!(LOAD_PATH, "../")
module BabyRobot
include("type.jl")
include("memory.jl")
include("../ear/ear.jl")
include("../mouth/mouth.jl")
# using Ear, Mouth

function 标点转意图(标::标点)
    if 标.内容 in Set(["。"])
        return 抽象意图("陈述")
    elseif 标.内容 in Set(["？"])
        return 抽象意图("提问")
    elseif 标.内容 in Set(["！"])
        return 抽象意图("感叹")
    else
        @error "未定义意图"
    end
end

function 生成回复(思考结果, 输出意图::抽象意图)
    if 输出意图.内容 == "陈述思考结果"
        if 思考结果 == "......"
            return 思考结果
        else
            return 思考结果*"。"
        end
    else
        @error "不知道怎么生成回复"
    end
end

"""
决定我做出怎样的反应。
"""
function 生成输出意图(句::句子)
    if 句.意图.内容 in Set(["提问"])
        输出意图 = 抽象意图("陈述思考结果")
    elseif 句.意图.内容 in Set(["陈述", "感叹"])
        输出意图 = 抽象意图("陈述思考结果")
    else
        @error "不知道做什么反应"
    end
end

function 解答提问(句::句子)
    问题类型 = 提取问题类型(句)
    return 思考结果 = 计算问题答案(问题类型, 句)
end

function 计算问题答案(问题类型::String, 句::句子)
    if 问题类型 in ("判断甲是怎样", "判断甲是乙")
        if 句.内容[1:end-1] in 记忆 
            思考结果 = 肯定的回答[rand(1:length(肯定的回答))]
        else
            思考结果 = 否定的回答[rand(1:length(否定的回答))]
        end
    else
        思考结果 = "不会算"
    end
    return 思考结果
end

function 生成逻辑任务(句::句子)
    if 句.意图.内容 in Set(["提问"])
        return 逻辑任务 = "解答提问"
    else
        return 逻辑任务 = "无反应"
    end
end
function 思考(句::句子)
    逻辑任务 = 生成逻辑任务(句)
    return 思考结果 = 执行逻辑任务(逻辑任务, 句)
end

function 听(字符向量::Vector{String})
    语元向量 = 字符转语元(字符向量)
    意图 = 标点转意图(语元向量[end])
    return 句子(Tuple(语元向量[1:end-1])..., 意图 = 意图)
end

"""
找到合适的中文处理模块前，用字符向量作为输入。
"""
function 听并思考并回复(字符向量::Vector{String})
    句 = 听(字符向量)
    思考结果 = 思考(句)
    输出意图 = 生成输出意图(句)
    回复结果 = 生成回复(思考结果, 输出意图)
    return 回复结果
end

function 提取问题类型(句::句子)
    return 提取问题类型(Tuple(句.内容[1:end-1])...)
end

function 提取问题类型(甲::名词, 是::be动词, 怎样::定语)
    return "判断甲是怎样"
end
function 提取问题类型(甲::名词, 是::be动词, 乙::名词)
    return "判断甲是乙"
end

function 无反应()
    return "......"
end

function 意图转标点(意图::抽象意图)
    if 意图.内容 in Set(["提问"])
        return 标点("？")
    elseif 意图.内容 in Set(["陈述"])
        return 标点("。")
    elseif 意图.内容 in Set(["感叹"])
        return 标点("！")
    else
        @error "未定义意图"
    end
end

function 语元分类(元::String)
    if 元 in 名词集
        return 名词(元)
    elseif 元 in 动词集
        return 动词(元)
    elseif 元 in be动词集
        return be动词(元)
    elseif 元 in 定语集
        return 定语(元)
    elseif 元 in 标点集
        return 标点(元)
    else
        @error "未记忆语元："
        println(元)
    end
end

function 字符转语元(字符向量::Vector{String})
    return map(语元分类, 字符向量)
end

function 执行逻辑任务(逻辑任务::String, 句::句子)
    if 逻辑任务 in Set(["无反应"])
        return 无反应()
    elseif 逻辑任务 in Set(["解答提问"])
        return 解答提问(句)
    else
        @error "不知道执行什么逻辑任务"
    end
end

end